package com.sky.controller.admin;

import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.CategoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

/**
 * 分类管理
 */
@RestController // 标记该类为RESTful控制器，返回的数据直接作为HTTP响应体
@RequestMapping("/admin/category") // 设置该控0       制器的基本URL路径为/admin/category
@Api(tags = "分类相关接口") // Swagger注解，用于生成API文档，标记该类为分类相关的接口
@Slf4j // Lombok注解，自动生成日志对象
public class CategoryController {

    @Autowired // Spring注解，自动注入CategoryService实例
    private CategoryService categoryService;

    /**
     * 新增分类
     * @param categoryDTO 分类数据传输对象
     * @return 操作结果
     */
    @PostMapping // 标记该方法为处理POST请求
    @ApiOperation("新增分类")
    public Result<String> save(@RequestBody CategoryDTO categoryDTO){ // @RequestBody注解，表示请求体中的JSON数据将映射到categoryDTO对象
        log.info("新增分类：{}", categoryDTO);
        categoryService.save(categoryDTO); // 调用服务层方法保存分类
        return Result.success(); // 返回成功结果
    }

    /**
     * 分类分页查询
     * @param categoryPageQueryDTO 分页查询条件
     * @return 分页查询结果
     */
    @GetMapping("/page") // 标记该方法为处理GET请求，URL路径为/page
    @ApiOperation("分类分页查询") // Swagger注解，用于生成API文档，描述该接口的功能
    public Result<PageResult> page(CategoryPageQueryDTO categoryPageQueryDTO){ // categoryPageQueryDTO包含分页查询的参数
        log.info("分页查询：{}", categoryPageQueryDTO); // 记录日志信息
        PageResult pageResult = categoryService.pageQuery(categoryPageQueryDTO); // 调用服务层方法进行分页查询
        return Result.success(pageResult); // 返回查询结果
    }

    /**
     * 删除分类
     * @param id 分类ID
     * @return 操作结果
     */
    @DeleteMapping // 标记该方法为处理DELETE请求
    @ApiOperation("删除分类") // Swagger注解，用于生成API文档，描述该接口的功能
    public Result<String> deleteById(Long id){ // id为要删除的分类的ID
        log.info("删除分类：{}", id); // 记录日志信息
        categoryService.deleteById(id); // 调用服务层方法删除分类
        return Result.success(); // 返回成功结果
    }

    /**
     * 修改分类
     * @param categoryDTO 分类数据传输对象
     * @return 操作结果
     */
    @PutMapping // 标记该方法为处理PUT请求
    @ApiOperation("修改分类") // Swagger注解，用于生成API文档，描述该接口的功能
    public Result<String> update(@RequestBody CategoryDTO categoryDTO){ // @RequestBody注解，表示请求体中的JSON数据将映射到categoryDTO对象
        categoryService.update(categoryDTO); // 调用服务层方法更新分类
        return Result.success(); // 返回成功结果
    }

    /**
     * 启用、禁用分类
     * @param status 状态，1表示启用，0表示禁用
     * @param id 分类ID
     * @return 操作结果
     */
    @PostMapping("/status/{status}") // 标记该方法为处理POST请求，URL路径包含状态参数
    @ApiOperation("启用禁用分类") // Swagger注解，用于生成API文档，描述该接口的功能
    public Result<String> startOrStop(@PathVariable("status") Integer status, Long id){ // @PathVariable注解，表示从URL路径中获取状态参数
        categoryService.startOrStop(status,id); // 调用服务层方法启用或禁用分类
        return Result.success(); // 返回成功结果
    }

    /**
     * 根据类型查询分类
     * @param type 分类类型
     * @return 分类列表
     */
    @GetMapping("/list") // 标记该方法为处理GET请求，URL路径为/list
    @ApiOperation("根据类型查询分类") // Swagger注解，用于生成API文档，描述该接口的功能
    public Result<List<Category>> list(Integer type){ // type为分类的类型
        List<Category> list = categoryService.list(type); // 调用服务层方法根据类型查询分类
        return Result.success(list); // 返回查询结果
    }
}
